package com.xiaoq.matrix.toutiao.util;

import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.fasterxml.jackson.databind.ObjectMapper;

import com.xiaoq.coms.util.UnicodeUtil;
import com.xiaoq.web.DefaultMapper;

public class TouTiaoArticle {
	

	private  static Logger logger= LoggerFactory.getLogger(TouTiaoArticle.class);
	
	
	
	
	 /** 
     * 模拟请求 
     *  
     * @param url       资源地址 
     * @param map   参数列表 
     * @param encoding  编码 
     * @return 
     * @throws ParseException 
     * @throws IOException 
     */  
	public static TouTiaoArticleStatus send(String url, Map<String, String> map, String encoding)
			throws ParseException, IOException {
		String body = "";
		// 创建httpclient对象
		CloseableHttpClient client = HttpClients.createDefault();
		// 创建post方式请求对象
		HttpPost httpPost = new HttpPost(url);

		// 装填参数
		List<NameValuePair> nvps = new ArrayList<NameValuePair>();
		if (map != null) {
			for (Entry<String, String> entry : map.entrySet()) {
				nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
			}
		}
		// 设置参数到请求对象中
		httpPost.setEntity(new UrlEncodedFormEntity(nvps, encoding));

		logger.debug("请求地址：" + url);
		logger.debug("请求参数：" + nvps.toString());

		// 设置header信息
		// 指定报文头【Content-type】、【User-Agent】
		httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");
		httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

		// 执行请求操作，并拿到结果（同步阻塞）
		CloseableHttpResponse response = client.execute(httpPost);
		// 获取结果实体
		HttpEntity entity = response.getEntity();
		TouTiaoArticleStatus articleStatus = null;
		if (entity != null) {
			// 按指定编码转换结果实体为String类型
			body = EntityUtils.toString(entity, encoding);
			logger.warn(body);
			ObjectMapper objectMapper = new DefaultMapper();
			articleStatus = objectMapper.readValue(body, TouTiaoArticleStatus.class);

		}
		EntityUtils.consume(entity);
		// 释放链接
		response.close();
		return articleStatus;
	}
    
    /**
     * map 是参数集合 返回的是一个
     * 返回的body是一个String类型的json http返回结果
     * @param map
     * @return
     * @throws ParseException
     * @throws IOException
     */
	public static TouTiaoArticleStatus updateStatus(Map<String, String> map) {
		String articleURL = TouTiaoConfig.getValue("article_url");
		articleURL = articleURL + "?access_token=" + map.get("access_token") + "&client_key="
				+ TouTiaoConfig.getValue("client_key");

		map.remove("access_token");
		TouTiaoArticleStatus articleStatus = null;
		try {
			articleStatus = send(articleURL, map, "utf-8");
			if (articleStatus != null) {
				String data = articleStatus.getData();
				if (data != null) {
					articleStatus.setData(UnicodeUtil.ascii2native(data));
					return articleStatus;
				}
			}else{
				logger.debug("articleStatus不能为空！");
			}

		} catch (ParseException | IOException e) {
			// TODO Auto-generated catch block
			logger.error("匹配格式或者IO异常", e);
		}

		return articleStatus;

	}

}
